perm filename 11STNK.17[KL,SYS] blob sn#209172 filedate 1976-04-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE 11STNK - STINKING ODOR OF PDP11'S
C00004 00003
C00009 00004
C00011 00005
C00014 00006
C00016 00007
C00019 00008
C00021 00009
C00025 00010
C00027 00011
C00029 00012
C00030 ENDMK
C⊗;
TITLE 11STNK - STINKING ODOR OF PDP11'S

.MLLIT==1

A=1
B=2
C=3
D=4
E=5
T=6
TT=7
H=10
I=11
J=12
Q=13
W=14
P=17


DLB==60
DLC==64
PAG==10
SWPUA=701540,,

11CORL==28.*1024.		;# WORDS OF PDP11 CORE

INCH==1
OUCH==2
TYIC==3
TYOC==4
ERRCH==5

OPENI:	SETZ
	SIXBIT/OPEN/
	[.UII,,INCH]
	0(Q)
	2(Q)
	3(Q)
	SETZ 1(Q)

OPENO:	SETZ
	SIXBIT/OPEN/
	[.BIO,,OUCH]
	0(Q)
	2(Q)
	3(Q)
	SETZ 1(Q)

;FILE NAME BLOCKS.  CONTAIN INITIAL DEFAULTS
;DEV SNM FN1 FN2

RUGFN:	SIXBIT/DSK/
	SIXBIT/./
	SIXBIT/KLRUG/
	SIXBIT/BIN/

DDTFN:	SIXBIT/DSK/
	SIXBIT/./
	SIXBIT/11DDT/
	SIXBIT/16K/

PRGFN:	SIXBIT/DSK/
	0
	SIXBIT/IOELEV/
	SIXBIT/BIN/

DMPFN:	SIXBIT/DSK/
	0
	SIXBIT/FOO/
	SIXBIT/BIN/

LPDL==50
PDL:	-LPDL,,.
	BLOCK LPDL

;COMMAND TABLE

;1ST WD - SIXBIT NAME OF COMMAND (FIRST LETTER MUST BE UNIQUE)
;2ND WD - (LH) 0 IF NO FILE NAME ELSE POINTER TO FILE NAME BLOCK
;       - (RH) DISPATCH ADDRESS
;3RD WD - POINTS TO ASCIZ HELP STRING

COMTAB:	SIXBIT/RUG/ ? RUGFN,,RUGLD ? [ASCIZ/LOAD RUG/]
	SIXBIT/DDT/ ? DDTFN,,DDTLD ? [ASCIZ/LOAD 11DDT/]
	SIXBIT/LOAD/ ? PRGFN,,PRGLD ? [ASCIZ/LOAD A PROGRAM/]
	SIXBIT/MAP/ ? 0,,MAP ? [ASCIZ/PRINT CORE MAP/]
	SIXBIT/ADUMP/ ? DMPFN,,ADUMP ? [ASCIZ/DUMP IN PALX BIN FORMAT/]
	SIXBIT/BDUMP/ ? DMPFN,,BDUMP ? [ASCIZ/DUMP IN KLDCP BIN FORMAT/]
	SIXBIT/TDUMP/ ? DMPFN,,TDUMP ? [ASCIZ/DUMP AS DL10 BOOTSTRAP PROGRAM/]
	SIXBIT/HELP/ ? 0,,HELP ? [ASCIZ/ /]
	SIXBIT/?/ ? 0,,HELP ? [ASCIZ/ /]
LCMTAB==.-COMTAB

HELP:	PUSHJ P,CRLF
	MOVE A,[-LCMTAB/3,,COMTAB]
HELP1:	MOVE TT,(A)
	PUSHJ P,SIXOUT
	MOVEI TT,[ASCIZ/ (FILENAME)/]
	MOVE T,1(A)
	TLNE T,-1
	 PUSHJ P,ASCOUT
	MOVEI TT,[ASCIZ/	- /]
	PUSHJ P,ASCOUT
	MOVE TT,2(A)
	PUSHJ P,ASCOUT
	PUSHJ P,CRLF
	ADDI A,2
	AOBJN A,HELP1
	POPJ P,

;SIXBIT OUTPUT FROM TT
SIXOUT:	MOVEI T,0
	LSHC T,6
	ADDI T,40
	.IOT TYOC,T
	JUMPN TT,SIXOUT
CPOPJ:	POPJ P,

CRLF:	MOVEI TT,[ASCIZ/
/]
;ASCIZ OUTPUT FROM TT
ASCOUT:	HRLI TT,440700
ASCOU1:	ILDB T,TT
	JUMPE T,CPOPJ
	.IOT TYOC,T
	JRST ASCOU1

;OCTAL OUTPUT FROM T
OCTOUT:	IDIVI T,8
	HRLM TT,(P)
	SKIPE T
	 PUSHJ P,OCTOUT
	HLRZ TT,(P)
	ADDI TT,"0
	.IOT TYOC,TT
	POPJ P,

;READ SYLLABLE FROM TTY
;RETURN SIXBIT IN TT, DELIMITER IN A

GETSYL:	MOVEI TT,0
	MOVE T,[440600,,TT]
GETSY1:	.IOT TYIC,A
	CAIE A,↑G
	CAIN A,177
	 JRST CMDER		;RUBOUT - ERR BACK TO COMMAND LEVEL
	CAIE A,":
	CAIN A,";
	 POPJ P,
	CAIG A,40
	 POPJ P,
	CAIGE A,140
	 SUBI A,40
	TLNE T,770000
	 IDPB A,T
	JRST GETSY1

;FILE NAME READER
;CALL WITH Q -> FILE NAME BLOCK.
;SUPPORTS ALTMODE, ↑X, ↑Y

FNR:	MOVEI TT,[ASCIZ/ (FILENAME) /]
	PUSHJ P,ASCOUT
	SKIPN 1(Q)
	 .SUSET [.RSNAM,,A]
	SKIPN 1(Q)
	 MOVEM A,1(Q)
FNR0:	SETZB B,C		;B,C,D,E = DEV,SNM,FN1,FN2
	SETZB D,E
FNR1:	PUSHJ P,GETSYL
	JUMPE TT,FNR2
	CAIN A,":
	 JRST [ MOVEM TT,B ? JRST FNR2 ]
	CAIN A,";
	 JRST [ MOVEM TT,C ? JRST FNR2 ]
FNR1A:	SKIPE D
	 SKIPA E,TT
	  MOVE D,TT
FNR2:	CAIL A,40
	 JRST FNR1
	CAIE A,33
	 JRST FNR3
	PUSHJ P,FNRST		;ALTMODE, SHOW CURRENT NAME
	PUSHJ P,CRLF
	PUSHJ P,FNRALT
	JRST FNR0

FNRALT:	IRPC ZZ,,[:;X	]
	 MOVE TT,.IRPCNT(Q)
	 PUSHJ P,SIXOUT
	 IFSE [ZZ]X,.IOT TYOC,[40]
	 .ELSE [ MOVEI TT,[ASCIZ/ZZ /] ? PUSHJ P,ASCOUT ]
	 TERMIN

FNR3:	CAIE A,↑X
	 JRST FNR4
	MOVE TT,2(Q)
	MOVEI A,40
	JRST FNR1A

FNR4:	CAIE A,↑Y
	 JRST FNRST
	MOVE TT,3(Q)
	MOVEI A,40
	JRST FNR1A

FNRST:	REPEAT 4,[
	SKIPE B+.RPCNT
	 MOVEM B+.RPCNT,.RPCNT(Q)
]	POPJ P,

GO:	MOVE P,PDL
	.OPEN TYIC,[.UAI,,'TTY]
	 .VALUE
	.OPEN TYOC,[.UAO,,'TTY]
	 .VALUE
	MOVE TT,[.FNAM1]
	PUSHJ P,SIXOUT
	.IOT TYOC,[".]
	MOVE TT,[.FNAM2]
	PUSHJ P,SIXOUT
	PUSHJ P,CRLF
	MOVSI A,-1		;LH -1 IF LOC NOT STORED INTO
	MOVEM A,11CORE
	MOVE A,[11CORE,,11CORE+1]
	BLT A,11CORE+11CORL-1

CMD:	MOVE P,PDL
	.IOT TYOC,["*]
	.IOT TYIC,A
	CAIGE A,40
	 JRST CMDER
	CAIGE A,140
	 SUBI A,40
	ANDI A,77
	MOVE B,[-LCMTAB/3,,COMTAB]
CMD1:	LDB T,[360600,,(B)]
	CAMN T,A
	 JRST CMD2
	ADDI B,2
	AOBJN B,CMD1
CMDER:	MOVEI TT,[ASCIZ/???
/]
	PUSHJ P,ASCOUT
	JRST CMD

CMD2:	MOVE TT,(B)		;COMPLETE THE COMMAND NAME
	LSH TT,6
	PUSHJ P,SIXOUT
	HLRZ Q,1(B)		;GET FILE NAME ARG IF NECC
	HRRZ H,1(B)
	JUMPE Q,CMD3
	PUSHJ P,FNR
CMD3:	PUSHJ P,(H)
	JRST CMD

FSERR:	.OPEN ERRCH,[.UAI,,'ERR ? 1 ? 0]
	 .VALUE
FSERR1:	.IOT ERRCH,A
	JUMPL A,FSERR2
	CAIGE A,40
	 JRST FSERR2
	.IOT TYOC,A
	JRST FSERR1

FSERR2:	MOVEI TT,[ASCIZ/ - /]
	PUSHJ P,ASCOUT
	PUSHJ P,FNRALT
	PUSHJ P,CRLF
	JRST CMD

DDTLD:	SETZM RUGFLG
	.CALL OPENI		;LOAD 11DDT
	 JRST FSERR
	PUSHJ P,ALOAD
	MOVEM W,RUGSA
	LSH W,-1
	MOVEI A,11CORE-2(W)	;-> WORD IN WHICH TO STORE START ADDRESS
	MOVEM A,SASTOR
	MOVEI A,11CORE-1(W)	;-> WORD TO CONTAIN LOWEST -11 ADDR OF SYMBOL TABLE
	MOVEM A,O.SYME
	MOVE A,(A)		;SET UP CURRENT CONTENTS
	LSH A,-1
	MOVEM A,RUGSYM
	MOVEI A,-2(W)		;-11 ADDR/2 OF HIGHEST SYMBOL TABLE LOC
	JRST RUGLD1		;FROM HERE ON WORKS LIKE RUG


RUGLD:	SETOM RUGFLG
	.CALL OPENI		;LOAD RUG
	 JRST FSERR
	PUSHJ P,ALOAD
	LSH W,-1		;START ADDR OF RUG -> VECTOR OF MAGIC CRUFT
	MOVE A,11CORE(W)	;FIRST WORD IS READ START ADDR (O.ODT)
	MOVEM A,RUGSA
	SETZM SASTOR		;RUG DOESN'T KNOW ABOUT PROG START ADDR
	MOVEI A,11CORE+2(W)	;-> WORD TO CONTAIN LOWEST -11 ADDR OF SYMBOL TABLE
	MOVEM A,O.SYME
	MOVE A,11CORE+2(W)	;THIRD WORD IS POINTER TO LOWEST SYMBOL TABLE LOC
	LSH A,-1
	MOVEM A,RUGSYM
	MOVE A,11CORE+1(W)	;SECOND WORD -> HIGH SYMBOL TABLE LOC
	LSH A,-1
RUGLD1:	SUB A,RUGSYM		;A := # WORDS OF SYMBOL TABLE
	IDIVI A,16.*3+2		;A := # BLOCKS, B := # WORDS IN LAST BLOCK
	JUMPE B,G0001
	MOVE A,RUGSYM
	ADD A,B			;A := WORD ADDR OF TOP OF BLOCK
	SUBI A,2
	MOVEM A,FLGPNT
	SUBI B,2
	IDIVI B,3		;B := # SYMBOLS ALREADY USED IN BLOCK
	SUBI B,16.
G0001:	MOVNM B,SYMCNT		;SET # OF SYMBOLS YET TO GO
	MOVE A,@O.SYME
	MOVEM A,SYMLO		;INITIAL LOW SYMBOL ADDR (FOR MAP)
	.CLOSE INCH,
	MOVE A,PRGHI
	MOVEM A,RUGHI
	SETZM PRGHI
	POPJ P,


PRGLD:	.CALL OPENI		;LOAD IOELEVEN
	 JRST FSERR
	PUSHJ P,ALOAD
	MOVEM W,SADR		;STORE START ADDR INTO 10
	MOVEM W,@SASTOR		;STORE START ADDR INTO 11
	PUSHJ P,SLOAD		;LOAD SYMBOLS INTO CORE IMAGE FOR RUG
	.CLOSE INCH,
	POPJ P,

;CORE LOADER

ALOAD:	.IOT INCH,A		;SEARCH FOR START OF BLOCK
	JUMPE A,ALOAD		;SKIPPING "BLANK TAPE"
	CAIE A,1
	 .VALUE			;UNKNOWN BLOCK TYPE
	.IOT INCH,A		;SECOND BYTE OF HEADER ALWAYS 0
	SKIPE A
	 .VALUE
	PUSHJ P,RWORD		;BYTE COUNT + 6
	HRREI Q,-6(W)
	PUSHJ P,RWORD		;LOAD ADDRESS
	JUMPLE Q,JBLK
LD1:	.IOT INCH,A		;BYTE TO BE LOADED
	TDNE A,[-400]
	 .VALUE
	CAIL W,11CORL*2
	 .VALUE
	CAMLE W,PRGHI
	 MOVEM W,PRGHI
	MOVEI J,2*11CORE(W)	;FIGURE OUT WHERE IT GOES
	ROT J,-1
	SKIPL J
	 TLOA J,001000
	  HRLI J,101000
	DPB A,J
	HRRZS @J		;MARK THIS WORD AS STORED INTO
	ADDI W,1
	SOJG Q,LD1
	.IOT INCH,A		;IGNORE CHECKSUM
	JRST ALOAD

JBLK:	.IOT INCH,A		;GOBBLE CHECKSUM
	JUMPE Q,CPOPJ		;RETURN FROM ALOAD WITH START ADDR IN W
	.VALUE			;BLOCK LENGTH < 6 ?

RWORD:	.IOT INCH,W		;FORM TWO BYTES INTO A WORD
	TDNE W,[-400]
	 .VALUE
	.IOT INCH,A
	TDNE A,[-400]
	 .VALUE
	LSH A,8
	IOR W,A
	POPJ P,

;SYMBOL LOADER

SBTB:	440600,,A	;SIXBIT BYTE POINTER TO A

RAD50:	MOVE Q,SBTB
	PUSHJ P,LOOP50
	HRRZM E,11CORE-3(B)
	PUSHJ P,LOOP50
	HRRZM E,11CORE-2(B)
	POPJ P,

LOOP50:	MOVEI E,0
	MOVEI D,3
LOP50:	ILDB C,Q
	PUSHJ P,CNVT
	IMULI E,50
	ADD E,C
	SOJG D,LOP50
	POPJ P,

CNVT:	CAIL C,41
	CAILE C,72
	 JRST NOTLET
	SUBI C,40
	POPJ P,

NOTLET:	CAIN C,4
	 JRST DOLR
	CAIN C,5
	 JRST PRCNT
	CAIN C,16
	 JRST PERD
	CAIG C,31
	CAIGE C,20
	 JRST NOTNUM
	ADDI C,16
	POPJ P,

NOTNUM:	MOVEI C,0
	POPJ P,

DOLR:	MOVEI C,33
	POPJ P,

PERD:	MOVEI C,34
	POPJ P,

PRCNT:	MOVEI C,35
	POPJ P,

SLOAD:	.IOT INCH,A		;LOAD SYMBOLS
	JUMPE A,SLOAD		;SKIP BLANK TAPE
	CAIE A,2
	 .VALUE			;NOT SYMBOLS BLOCK
	MOVE B,RUGSYM		;LOAD SYMBOLS AT -3(B),-2(B),-1(B)
	MOVE H,SYMCNT		;# SYMBOLS YET TO GO IN THIS BLOCK
	MOVE A,FLGPNT
	HRLZ I,11CORE+1(A)	;PICK UP REGISTER FLAGS WORD
	HRR I,11CORE(A)		;PICK UP HALF-KILL FLAGS WORD
	JUMPN H,SLOAD1
SLOAD0:	MOVEI H,16.		;NEW BLOCK
	MOVE B,RUGSYM
	SUBI B,2
	MOVEM B,RUGSYM
	MOVEM B,FLGPNT
	SETZB I,11CORE(B)
	SETZM 11CORE+1(B)
SLOAD1:	.IOT INCH,A
	JUMPE A,SLOADE
	AOJE A,SLOADE
	SOS A
	PUSHJ P,RAD50		;DEPOSIT 2 -11 WORDS OF RADIX 50 FOR THIS SIXBIT
	.IOT INCH,A		;GET FLAGS AND VALUE
	HRRZM A,11CORE-1(B)	;STORE VALUE
	MOVEI D,100000
	MOVNI E,-1(H)		;E IS 0 FOR LOWEST SYM IN BLOCK, -15. FOR HIGHEST
	LSH D,(E)		;POINT TO RIGHT BIT IN FLAG
	TLNE A,4000
	 TLO I,(D)		;2ND FLAG WORD
	TLNE A,20000
	 TRO I,(D)		;1ST FLAG WORD
	SUBI B,3
	SOJG H,SLOAD1
	MOVE A,FLGPNT		;BLOCK DONE, FILL OUT
	HLRZM I,11CORE+1(A)
	HRRZM I,11CORE(A)
	MOVEM B,RUGSYM
	JRST SLOAD0		;START NEXT BLOCK

SLOADE:	MOVE A,FLGPNT		;FINISH LAST BLOCK
	HLRZM I,11CORE+1(A)
	HRRZM I,11CORE(A)
	MOVEM B,RUGSYM
	LSH B,1
	MOVEM B,@O.SYME		;TELL RUG WHERE SYMBOL TABLE ENDS
	MOVEM B,SYMLO
	POPJ P,

RUGSYM:	0		;WORD ADDR OF LOWEST LOC IN RUG SYMBOL TABLE
FLGPNT:	0		;WORD ADDR OF FLAG PAIR FOR CURRENT SYM BLOCK
SYMCNT:	0		;NUMBER OF SYMBOLS NOT YET GENERATED INTO CURRENT BLOCK
O.SYME:	0		;-> WORD IN -11 CORE IMAGE WHICH CONTAINS LOWEST
			;-11 ADDR USED BY SYMBOL TABLE
RUGFLG:	0		;-1 RUG, 0 11DDT
SASTOR:	0		;-> WORD IN -11 CORE IMAGE WHERE START ADDRESS IS STORED
PRGHI:	0		;HIGHEST LOC LOADED
SYMLO:	0		;LOWEST LOC LOADED WITH SYMBOLS
RUGSA:	0		;START ADDR OF RUG/DDT (ALSO ASSUMED TO BE LOWEST LOC)
RUGHI:	0		;HIGHEST LOC LOADED WITH RUG/DDT

MAP:	PUSHJ P,CRLF
	IRP WD,,[PRGHI,SYMLO,RUGSA,RUGHI,SADR]NM,,[HIGHEST PROGRAM LOC,LOWEST SYMBOL LOC,START ADDRESS OF DEBUGGER,HIGHEST DEBUGGER LOC,PROGRAM START ADDRESS]
	MOVEI TT,[ASCIZ/NM=/]
	PUSHJ P,ASCOUT
	MOVE T,WD
	PUSHJ P,OCTOUT
	PUSHJ P,CRLF
	TERMIN
	POPJ P,

;DUMP OUT AS PDP11 ABSOLUTE BINARY
;ADUMP DUMPS ONE BYTE PER WORD, LIKE PALX
;BDUMP DUMPS FOUR BYTES PER WORD, ARRANGED IN A WAY TO CORRESPOND
;TO THE RH11.  THIS FOR KLDCP '.BIN' FILES.
;I IS BYTE# FOR BDUMP, J IS BUFFER, Q IS CHECKSUM, W IS -11 ADDR

BDMPNT:	221000,,J
	321000,,J
	001000,,J
	101000,,J

ADMPNT:	001000,,J

PUTB:	0		;APUTB OR BPUTB

APUTB:	DPB A,ADMPNT
	ADD Q,A
APUTW:	HRROI TT,J
	.IOT OUCH,TT
APUTW1:	MOVSI I,-4
	MOVEI J,0
	POPJ P,

BPUTB:	DPB A,BDMPNT(I)
	ADD Q,A
	AOBJP I,APUTW
	POPJ P,

ADUMP:	SKIPA TT,[APUTB]
BDUMP:	 MOVEI TT,BPUTB
	MOVEM TT,PUTB
	.CALL OPENO
	 JRST FSERR
	PUSHJ P,APUTW1
	MOVSI W,-11CORL
ADUMP1:	SKIPGE 11CORE(W)		;SEARCH FOR WORD THAT'S BEEN LOADED
	 AOBJN W,ADUMP1
	JUMPGE W,DUMPJB		;ALL CORE DUMPED, DO JUMP BLOCK
	MOVEI H,(W)		;H := PDP11 ADDR OF FIRST WORD
	LSH H,1
	HRLI W,-30		;MAX BLOCK LENGTH; SCAN FOR WORD NOT LOADED
ADUMP2:	SKIPL 11CORE(W)
	 AOBJN W,ADUMP2
	JUMPGE W,ADUMP4		;BLOCK MAX SIZE
	SKIPL 11CORE+1(W)
	 AOBJN W,ADUMP2		;NOT TWO ZEROES IN A ROW
ADUMP4:	MOVEI E,(W)		;NEXT LOCATION TO LOOK AT IS SAVED IN E	
	MOVEI Q,0		;INIT CKSM
	MOVEI A,1		;PUT BLOCK HEADER
	PUSHJ P,@PUTB
	MOVEI A,0
	PUSHJ P,@PUTB
	MOVE A,E
	LSH A,1
	SUB A,H
	MOVE D,A
	ADDI A,6
	PUSHJ P,DWORD		;BYTE COUNT
	MOVE A,H
	PUSHJ P,DWORD		;LOAD ADDRESS
	MOVE W,H
	LSH W,-1
	LSH D,-1
	MOVNS D
	HRL W,D			;NOW W IS AOBJN PTR TO WORDS TO DUMP
ADUMP5:	MOVE A,11CORE(W)
	PUSHJ P,DWORD
	AOBJN W,ADUMP5
	MOVN A,Q		;PUNCH CHECKSUM
	PUSHJ P,@PUTB
	PUSHJ P,FEED
	MOVE W,E		;SET UP AOBJN PTR TO CORE YET TO BE DUMPED
	SUBI E,11CORL
	HRL W,E
	JRST ADUMP1

DUMPJB:	MOVEI Q,0
	MOVEI A,1		;JUMP BLOCK
	PUSHJ P,@PUTB
	MOVEI A,0
	PUSHJ P,@PUTB
	MOVEI A,6
	PUSHJ P,@PUTB
	MOVEI A,0
	PUSHJ P,@PUTB
	MOVE A,RUGSA
	PUSHJ P,DWORD
	MOVN A,Q
	PUSHJ P,@PUTB
	PUSHJ P,FEED
	.CLOSE OUCH,
	.BREAK 16,160000

FEED:	MOVEI A,0		;PUNCH 8 NULL FRAMES
	PUSHJ P,.+1
	PUSHJ P,.+1
	PUSHJ P,.+1
	JRST @PUTB

DWORD:	LDB B,[101000,,A]
	PUSHJ P,@PUTB
	MOVE A,B
	JRST @PUTB

;DUMP OUT AS A DL10 BOOTSTRAP PROGRAM
;THIS IS A STANDALONE PDP10 PROGRAM WHICH LOADS THE -11 ON DL10 PORT#0

TDUMP:	.CALL OPENO
	 JRST FSERR
	MOVSI A,-11CORL		;CHANGE -1,,0 TO 0
	HRRZS 11CORE(A)		;SINCE WILL LOAD ALL -11 CORE
	AOBJN A,.-1
	HRROI A,[JRST 1]	;WRITE SBLK FILE
	.IOT OUCH,A
	MOVEI H,BOOTST
DMPLP:	CAIL H,BOOTEN		;FIND NON-ZERO
	 JRST DMPEN
	SKIPN (H)
	 AOJA H,DMPLP
	MOVE J,H		;FIND 2 CONSECUTIVE ZEROS
	HRLI J,-200		;WITHIN NEXT 200 WORDS
ZERLP:	SKIPE (J)
	 AOBJN J,ZERLP
	JUMPGE J,DMPBLK
	AOBJP J,DMPBLK
	SKIPE (J)
	 JRST ZERLP

DMPBLK:	SUBM H,J		;RH(J) := - # BLOCKS
	HRL H,J
	PUSH P,[DMPLP]
	HRROI A,H
	.IOT OUCH,A		;HEADER
	MOVE Q,H
	MOVE J,H
	.IOT OUCH,H		;DATA
CKSLP:	ROT Q,1
	ADD Q,(J)
	AOBJN J,CKSLP
	HRROI A,Q
	.IOT OUCH,A		;CHECKSUM
	POPJ P,

DMPEN:	HRROI A,[JUMPA BOOTER]	;START ADDR
	.IOT OUCH,A
	MOVSI H,-LSYMT
	HRROI A,H
	.IOT OUCH,A		;HEADER
	MOVE Q,H
	HRRI H,SYMT
	MOVE J,H
	.IOT OUCH,H		;DATA
	PUSHJ P,CKSLP
	HRROI A,[JUMPA BOOTER]	;START ADDR AGAIN
	.IOT OUCH,A
	.CLOSE OUCH,
	.BREAK 16,160000

CONSTANTS

SYMT:	SQUOZE 0,GLOBAL
	-LSYMT,,0
	SQUOZE 4,RUG
	GORUG
	SQUOZE 4,GO
	BOOTER
	SQUOZE 4,11CORE
	11CORE
	SQUOZE 4,SADR
	SADR
LSYMT==.-SYMT

;THE PROGRAM THAT GOES ON THE MAGDMP TAPE

IFG .-4000,.ERR BLOAT
LOC 4000
BOOTST::
GORUG:	MOVE A,RUGSA		;ENTER HERE TO START 11 IN RUG
	MOVEM A,SADR		;ENTER BELOW TO START 11 IN IOELEV
BOOTER:	CONI PAG,A		;FLUSH CACHE
	TRZN A,600000
	 JRST BOOTAA
	SWPUA
	CONSZ APR,200000
	 JRST .-1
	CONO PAG,(A)
BOOTAA:	CONO DLC,400000		;RESET DL10
	MOVEI A,5000
	SOJG A,.
	CONO DLB,DL10AR
	DATAO DLC,[40]		;STOP PDP11
	DATAI DLC,A
	TRNE A,20
	 JRST .-2
	MOVSI A,2
	SOJG A,.
	CONO DLC,100020		;PORT ENB
	DATAO DLC,[20]		;START PDP11
	DATAI DLC,A
	TRNN A,20
	 JRST .-2
;PDP11 IS NOW RUNNING OUT OF DL10 AREA

IFLE 11CORL-40000,MOVSI Q,-11CORL	;LOAD ONLY 16K
.ELSE		  MOVSI Q,-40000
BOOTLP:	MOVE A,11CORE(Q)	;TELL 11 BOOTSTRAP PROGRAM TO STORE ONE WORD
	SKIPE FLAG
	 JRST .-1
	MOVEM A,DAT
	AOS FLAG
	AOBJN Q,BOOTLP
	SKIPE FLAG
	 JRST .-1
	MOVEI A,000407		;BR FROM 100004 TO 100024
	MOVEM A,DL10AR+2
	MOVEI A,25.		;ALLOW TIME FOR -11 TO GET STARTED
	SOJG A,.
	CONO DLC,400000		;THEN, QUICK, TURN OFF PORT ENB WHILE IT'S IN INIT CODE
	SKIPE -4000
	 JRST -4000	;IF DDT IS PRESENT RETURN TO IT
	JRST -400	;ELSE RETURN TO MAGDMP

CONSTANTS

LOC 5000
DL10AR:	JRST 4,.
	005001		;100002/ CLR %1
	005727		;100004/ TST #0
FLAG:	0		;100006/ 0 => 11 READY FOR WORD, NON-0 => WORD GIVEN
	001775		;100010/ BEQ 100004
	012721		;100012/ MOV #0,(1)+
DAT:	0		;100014/ VALUE TO BE STORED
	005037		;100016/ CLR @#FLAG
	100006		;100020/
	000770		;100022/ BR 100004
	000137		;100024/ JMP @#1
SADR:	1		;100026/ THE START ADDRESS

LOC 6000
11CORE:	BLOCK 11CORL

BOOTEN:	-1		;MIDAS CORING BUG

END GO